'use strict'

const chai = require('chai')
const path = require('path')
const sinon = require('sinon')
const overrideEnv = require('process-utils/override-env')
const fsp = require('fs').promises
const loadEnv = require('../../../../lib/cli/load-dotenv')
const dotenv = require('dotenv')
const ServerlessError = require('../../../../lib/serverless-error')

chai.use(require('chai-as-promised'))
const expect = require('chai').expect

describe('test/unit/lib/cli/load-dotenv.test.js', () => {
  let restoreEnv

  before(async () => {
    const stage = 'testing'
    const stageFileContent = 'FROM_STAGE=valuefromstage'
    await fsp.writeFile(
      path.join(process.cwd(), `.env.${stage}`),
      stageFileContent,
    )

    const defaultFileContent = 'FROM_DEFAULT=valuefromdefault'
    await fsp.writeFile(path.join(process.cwd(), '.env'), defaultFileContent)
  })

  beforeEach(() => {
    restoreEnv = overrideEnv().restoreEnv
  })

  afterEach(() => {
    restoreEnv && restoreEnv()
  })

  it('should load matching stage env file if present', async () => {
    await loadEnv('testing')
    expect(process.env).to.not.have.property('FROM_DEFAULT')
    expect(process.env.FROM_STAGE).to.equal('valuefromstage')
  })

  it('should load from default env file if present and no matching stage file found', async () => {
    await loadEnv('nonmatchingstage')
    expect(process.env.FROM_DEFAULT).to.equal('valuefromdefault')
    expect(process.env).to.not.have.property('FROM_STAGE')
  })

  it('should throw ServerlessError if dotenv returns error other than missing file', () => {
    const errorMessage = 'Unexpected error while loading env'
    const dotenvResult = sinon
      .stub(dotenv, 'config')
      .returns({ error: new Error(errorMessage) })

    expect(() => loadEnv('testing'))
      .to.throw(ServerlessError)
      .with.property('code', 'DOTENV_LOAD_ERROR')
    dotenvResult.restore()
  })
})
